package com.muyu.interceptor;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @ClassName: LoggerInterceptor
 * @Author: Zirun.Xin
 * @Date: 2025/3/24 下午4:00
 * @Version: 1.0
 * @Description: 日志拦截器，用于记录请求的URL信息。
 */
@Slf4j
@Component
public class LoggerInterceptor implements HandlerInterceptor {

    /**
     * 在请求处理之前执行，记录请求的URL信息。
     *
     * @param request  HttpServletRequest对象，包含客户端请求的信息
     * @param response HttpServletResponse对象，用于向客户端发送响应
     * @param handler  处理请求的处理器对象
     * @return 返回true表示继续执行后续的拦截器和处理器，返回false则中断执行
     * @throws Exception 如果发生异常
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
                             Object handler) throws Exception {
        log.info("【拦截器工作】preHandler 请求接口url为：{}", request.getRequestURI());
        return true;
    }

    /**
     * 在请求处理之后，视图渲染之前执行。
     *
     * @param request      HttpServletRequest对象，包含客户端请求的信息
     * @param response     HttpServletResponse对象，用于向客户端发送响应
     * @param handler      处理请求的处理器对象
     * @param modelAndView ModelAndView对象，包含模型数据和视图信息
     * @throws Exception 如果发生异常
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response,
                           Object handler, ModelAndView modelAndView) throws Exception {
        HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
    }

    /**
     * 在整个请求结束之后执行，主要用于资源清理工作。
     *
     * @param request  HttpServletRequest对象，包含客户端请求的信息
     * @param response HttpServletResponse对象，用于向客户端发送响应
     * @param handler  处理请求的处理器对象
     * @param ex       请求处理过程中抛出的异常，如果没有异常则为null
     * @throws Exception 如果发生异常
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
                                Object handler, Exception ex) throws Exception {
        HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
    }
}
